//Promise 的链式调用

function ajax (url) {
    return new Promise(function (resolve, reject) {
        //AJAX请求
        var xhr = new XMLHttpRequest()
        //请求方式和地址
        xhr.open('GET', url)
        //请求类型
        //获取结果为json对象而不是字符串
        xhr.responseType = 'json'
        //请求完成过后执行
        xhr.onload = function () {
            if (this.status === 200) {
                //请求成功 返回请求的结果
                resolve(this.response)
            } else {
                //请求失败 返回错误信息 即当前状态文本
                reject(new Error(this.statusText))
            }
        }
        //开始执行异步请求
        xhr.send()
    }) 
}

// var promise = ajax('/api/users.json')

// //执行回调函数  返回结果也是一个promise对象
// var promise2 = promise.then(
//     //成功后的回调
//     function onFulfilled (value) {
//         console.log('onFulfilled', value);
//     },
//     //失败后的回调
//     function onRejected (error) {
//         console.log('onRejected', error);
//     }
// )

// console.log(promise2);       //打印一个Promise对象
// console.log(promise === promise2);      //并不是一个对象
// //因此并不是返回的this方法的链式调用

//执行完一个回调任务后，再去返回一个新的承诺，相互之前无影响
//链式then方法是依次执行  可以在then当中手动回调一个promise对象
ajax('/api/users.json')
    .then(function (value) {
        console.log(1111);
        return ajax('/api/users.json')
    }) // => promise添加状态名并回调
    //每个then方法实际上是为了上一个then方法返回的promise对象添加状态名过后的回调
    //此时的then执行的则是上一个return的ajax的回调任务  可以避免回调的嵌套
    .then(function (value) {
        console.log(2222);
        //则是返回的promise的返回的值  下一个then方法的获取值则是该值
        //若没有返回任何值 则默认返回undefined
        return 'foo'        
    })
    .then(function (value) {
        console.log(value);
    })
    .then(function (value) {
        console.log(4444);
    })
    .then(function (value) {
        console.log(5555);
    })